using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class User
{
    private static Dictionary<string, string> _registeredUsers = new Dictionary<string, string>();

    public static void TestPrint()
    {
        bool isRunning = true;
        Console.WriteLine("=== 用户登录与注册系统 ===");

        while (isRunning)
        {
            Console.WriteLine("\n===== 主菜单 =====");
            Console.WriteLine("1. 登录");
            Console.WriteLine("2. 注册");
            Console.WriteLine("3. 退出");
            Console.Write("请选择功能（输入数字1-3）：");

            string input = Console.ReadLine()?.Trim();
            if (string.IsNullOrEmpty(input))
            {
                Console.WriteLine("输入不可为空，请重新输入！");
                continue;
            }

            if (!int.TryParse(input, out int choice))
            {
                Console.WriteLine("输入错误，请输入有效数字（1-3）！");
                continue;
            }

            switch (choice)
            {
                case 1:
                    HandleLogin();
                    break;
                case 2:
                    HandleRegister();
                    break;
                case 3:
                    isRunning = false;
                    Console.WriteLine("系统已退出，感谢使用！");
                    break;
                default:
                    Console.WriteLine("输入错误，请选择1-3之间的数字！");
                    break;
            }
        }
    }

    private static void HandleRegister()
    {
        Console.WriteLine("\n=== 用户注册 ===");

        string username = GetValidUsername();
        if (string.IsNullOrEmpty(username))
        {
            Console.WriteLine("注册流程终止");
            return;
        }

        // 2. 验证并获取密码
        string password = GetValidPassword();
        if (string.IsNullOrEmpty(password))
        {
            Console.WriteLine("注册流程终止");
            return;
        }

        // 3. 保存用户信息
        _registeredUsers.Add(username, password);
        Console.WriteLine("注册成功！已返回主菜单");
    }

    // 处理用户登录逻辑
    private static void HandleLogin()
    {
        Console.WriteLine("\n=== 用户登录 ===");

        // 输入用户名
        Console.Write("请输入用户名：");
        string username = Console.ReadLine()?.Trim();
        if (string.IsNullOrEmpty(username))
        {
            Console.WriteLine("用户名不可为空！登录失败");
            return;
        }

        // 输入密码
        Console.Write("请输入密码：");
        string password = Console.ReadLine()?.Trim();
        if (string.IsNullOrEmpty(password))
        {
            Console.WriteLine("密码不可为空！登录失败");
            return;
        }

        // 验证用户
        if (!_registeredUsers.ContainsKey(username))
        {
            Console.WriteLine("登录失败：用户名不存在");
        }
        else if (_registeredUsers[username] != password)
        {
            Console.WriteLine("登录失败：密码错误");
        }
        else
        {
            Console.WriteLine($"登录成功！欢迎回来，{username}！");
            Console.WriteLine("=== 系统首页 ===");
            Console.WriteLine("（模拟系统功能...）");
        }
    }

    // 验证用户名并返回有效用户名（null表示验证失败）
    private static string GetValidUsername()
    {
        while (true)
        {
            Console.Write("请输入用户名（3-15字符，仅含字母、数字、下划线）：");
            string username = Console.ReadLine()?.Trim();

            // 非空验证
            if (string.IsNullOrEmpty(username))
            {
                Console.WriteLine("用户名不可为空，请重新输入！");
                continue;
            }

            // 格式验证（正则表达式：3-15位，包含字母、数字、下划线）
            if (!Regex.IsMatch(username, @"^[a-zA-Z0-9_]{3,15}$"))
            {
                Console.WriteLine("用户名格式错误！需满足：");
                Console.WriteLine("1. 长度3-15个字符");
                Console.WriteLine("2. 仅包含字母、数字、下划线（_）");
                continue;
            }

            // 唯一性验证
            if (_registeredUsers.ContainsKey(username))
            {
                Console.WriteLine("该用户名已被注册，请更换用户名！");
                continue;
            }

            return username;
        }
    }

    // 验证密码并返回有效密码（null表示验证失败）
    private static string GetValidPassword()
    {
        while (true)
        {
            // 输入密码
            Console.Write("请输入密码（6-20字符，含大小写字母和数字）：");
            string password = Console.ReadLine()?.Trim();

            // 非空验证
            if (string.IsNullOrEmpty(password))
            {
                Console.WriteLine("密码不可为空，请重新输入！");
                continue;
            }

            // 格式验证（正则表达式：6-20位，含至少1个大写、1个小写、1个数字）
            if (!Regex.IsMatch(password, @"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,20}$"))
            {
                Console.WriteLine("密码格式错误！需满足：");
                Console.WriteLine("1. 长度6-20个字符");
                Console.WriteLine("2. 包含至少1个大写字母、1个小写字母和1个数字");
                continue;
            }

            // 确认密码
            Console.Write("请确认密码：");
            string confirmPwd = Console.ReadLine()?.Trim();
            if (password != confirmPwd)
            {
                Console.WriteLine("两次输入的密码不一致，请重新输入！");
                continue;
            }

            return password;
        }
    }
}